#include<iostream>
#include<vector>
#include<string>
#include<unistd.h>
#include<pthread.h>
 
using namespace std;
 
#define NUM 4
int tickets=3000;
 
class PtData
{
public:
    PtData(int number,pthread_mutex_t* lock)
    {
        _ptname="thread-"+to_string(number);
        _lock=lock;
    }
 
public:
    string _ptname;
    pthread_mutex_t* _lock;
};
 
void* GetTicket(void* args)//模拟一轮抢票
{
    PtData* td=static_cast<PtData*>(args);
    const char* name=td->_ptname.c_str();
    pthread_mutex_t* lock=td->_lock;
    while(true)
    {
        //加锁
        pthread_mutex_lock(lock);
        if(tickets>0)
        {
            usleep(1000);
            printf("who=%s,get a ticket:%d \n",name,tickets);
            tickets--;
            pthread_mutex_unlock(lock);//访问完临界资源要解锁
        }
        else 
        {
            pthread_mutex_unlock(lock);//访问完临界资源要解锁
            break;
        }
	usleep(15);
    }
    printf("%s....quit\n",name);
    return nullptr;
}
 
int main()
{
    //创建多线程
    vector<pthread_t> tids;
    vector<PtData*> pds;
    //初始化锁
    pthread_mutex_t lock;
    pthread_mutex_init(&lock,nullptr);
    for(int i=1;i<=NUM;i++)
    {
        pthread_t tid;
        PtData* td=new PtData(i,&lock);//让不同的线程看到同一把锁，都传同一把锁
        pds.push_back(td);
        pthread_create(&tid,nullptr,GetTicket,td);
        tids.push_back(tid);
    }
 
    for(auto tid:tids)
    {
        pthread_join(tid,nullptr);
    }
    for(auto pd:pds)
    {
        delete pd;
    }
    //锁的销毁
    pthread_mutex_destroy(&lock);
    return 0;
}


//#include<iostream>
//#include<cstring>
//#include<unistd.h>
//#include<pthread.h>
//using namespace std;
//
//void* PthreadRoutine(void* args)
//{
//    int i=0;
//    pthread_detach(pthread_self());
//    while(i<3)
//    {
//        cout<<"child thread ,pid: "<<getpid()<<endl;
//        i++;
//        sleep(1);
//    }
//    return nullptr;
//}
//int main()
//{
//    pthread_t tid;
//    pthread_create(&tid,nullptr,PthreadRoutine,nullptr);
//    sleep(1);//确保分离成功
// 
//    int n=pthread_join(tid,nullptr);
//    printf("n = %d, who = 0x%x, why: %s\n", n, tid, strerror(n));
// 
//    return 0;
// 
//}


//#include<iostream>
//#include<pthread.h>
//#include<unistd.h>
//#include<stdlib.h>
// 
//using namespace std;
// 
//void* threadroutine(void * arg)
//{
//    const char* name=(const char*)arg;
//    int cnt=5;
//    while(true)
//    {
//        cout<<name<<",pid: "<<getpid()<<endl;
//        sleep(1);
//        cnt--;
//        if(cnt==0) break;
//    }
//    return (void*)1;//我的当前平台，地址是64位，8字节，而int是4字节，不进行强转会导致混乱
//}
// 
// 
//int main()
//{
//    pthread_t tid;
//    pthread_create(&tid,nullptr,threadroutine,(void*)"new thread");
// 
//    void * retval;
//    pthread_join(tid,&retval);// main thread等待的时候，默认是阻塞等待的！
// 
//    cout << "main thread quit ..., ret: " << (long long int)retval << endl;
//  
//    return 0;
//}





//#include<iostream>
//#include<pthread.h>
//#include<unistd.h>
//#include<stdlib.h>
// 
//using namespace std;
// 
//void* threadroutine(void * arg)
//{
//    const char* name=(const char*)arg;
//    while(true)
//    {
//        cout<<name<<",pid: "<<getpid()<<endl;
//        sleep(2);
//    }
//}
// 
// 
//int main()
//{
//    pthread_t tid;
//    pthread_create(&tid,nullptr,threadroutine,(void*)"new thread");
// 
//    while(true)
//    {
//        cout<<"main thread,pid: "<<getpid()<<endl;
//        sleep(1);
//    }
//    return 0;
//}
